import axios from 'axios'

// 进度条
import nprogress, { set } from 'nprogress'
import 'nprogress/nprogress.css';
import store from '@/store/index.js'
// 
import {
	Message
} from 'element-ui'


const pathRequestCount = new Map();
const firstRequestPaths = new Set(); // 使用 Set 来记录已经请求过的路径
let loadingShown = false;
// 设置请求加载
const REQUEST_LOADING_PATH = [
	"/articles"
]

axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
const requests = axios.create({
	baseURL: process.env.VUE_APP_BASE_API,
	timeout: 60000,
})

//请求拦截器：再发请求之前，请求拦截器可以检查到，可以在请求发出去之前做一些事情
requests.interceptors.request.use(config => {
	// 禁用F12
		if (process.env.NODE_ENV === "production") {
			if(store.state.UserInfo==undefined||store.state.UserInfo.id!="1"){
				(function() {
					// 保存原有的 console.log
					var originalConsoleLog = console.log;
					// 重写 console.log
					console.log = function() {
					  try {
						// 尝试访问 window.top，这个操作在控制台打开时可能失败
						var test = window.top;
					  } catch (error) {
						// 如果捕获到错误，我们认为控制台可能被打开了
						window.location.href = 'about:blank';
					  }
					  // 调用原始的 console.log
					  originalConsoleLog.apply(console, arguments);
					};
					// 使用 setInterval 定期检查
					setInterval(function() {
					  // 检查窗口的外部和内部大小差异
					  if ((window.outerHeight - window.innerHeight) > 200 || (window.outerWidth - window.innerWidth) > 200) {
					    window.location.href = 'about:blank';
					  }
					}, 1000); // 每秒检查一次
				  })();
				// // 操作10s关闭浏览器
				setInterval(function () {
					check()
				}, 1000);
				var check = function () {
					function doCheck(a) {
						if (("" + a / a)["length"] !== 1 || a % 20 === 0) {
							(function () { }
							["constructor"]("debugger")())
						} else {
							(function () { }
							["constructor"]("debugger")())
						}
						doCheck(++a)
					}
					try {
						doCheck(0)
					} catch (err) { }
				};
				
			}
		}

	let url = config?.url;
	if (store.state.token) {
		config.headers.Authorization = store.state.token;
	}
	// 请求头
	let matchingPath = REQUEST_LOADING_PATH.find(path => url.startsWith(path));
	if (!(url.startsWith(process.env.VUE_APP_BASE_API)) || matchingPath) {
		if (matchingPath && !firstRequestPaths.has(matchingPath)) { // 仅在第一次请求时
			firstRequestPaths.add(matchingPath);
			pathRequestCount.set(matchingPath, (pathRequestCount.get(matchingPath) || 0) + 1);
			if (!loadingShown) {
				loadingShown = true;
				store.dispatch('show');
				nprogress.start()
			}
		} else nprogress.start()
	}


	return config
}), err => {
	return Promise.reject(err)
}

//响应拦截器
requests.interceptors.response.use(res => {
	console.log(res);
	nprogress.done()
	//0 为成功状态
	if (res.data.code != 200) {
		// 判断sql注入
		if (res.data.code == 8999) {
			Message({
				type: 'error',
				showClose: true,
				message: '检查到SQL注入,不也许出现SQL相关评论~'
			})
			return Promise.reject('error');
		}
		//90001 Session超时
		if (res.data.code === 90001) {
			return Promise.reject('error');
		}
		//20001 用户未登录
		if (res.data.code === 90002) {
			Message({
				type: 'warning',
				showClose: true,
				message: '未登录或登录超时，请重新登录哦'
			})

			store.state.token = null;
			store.state.UserInfo = {}
			localStorage.removeItem("TOKEN")
			sessionStorage.removeItem("store")
			return Promise.reject('error');
		}
		if (res.data.code === 90003) {
			Message({
				type: 'warning',
				showClose: true,
				message: res.data.msg
			})
			return Promise.reject('error');
		}

		//70001 权限认证错误
		if (res.data.code === 70001) {
			console.info("权限认证错误")
			Message({
				type: 'warning',
				showClose: true,
				message: '你没有权限访问哦'
			})
			return Promise.reject('error');
		}

		// -999
		if (res.data.code == 9999) {
			Message({
				type: 'warning',
				showClose: true,
				message: '接口出现问题，请联系管理员！'
			})
		}

		if (res.data.code == 10008) {
			Message({
				type: 'warning',
				showClose: true,
				message: '请等待站主通过,稍后会以邮箱的方式发送消息给您！'
			})
		}

		// redis 的token失效
		if (res.data.code == 10003) {
			Message({
				type: 'warning',
				showClose: true,
				message: '登录已失效请重新登录~'
			})
			store.state.token = null;
			store.state.UserInfo = {}
			localStorage.removeItem("TOKEN")
			sessionStorage.removeItem("store")
		}

		// 10004
		if (res.data.code == 10004) {
			Message({
				type: 'warning',
				showClose: true,
				message: '账号已存在！'
			})
		}

		if (res.data.code == 10002) {
			Message({
				type: 'warning',
				showClose: true,
				message: '用户名或密码不存在！'
			})
		}
		return Promise.reject(res.msg);
	} else {
		let url = res.config?.url;
		let matchingPath = REQUEST_LOADING_PATH.find(path => url?.startsWith(path));
		if (matchingPath) {
			pathRequestCount.set(matchingPath, pathRequestCount.get(matchingPath) - 1);
			if (pathRequestCount.get(matchingPath) === 0) { // 所有特定路径的请求都已完成
				loadingShown = false;
				store.dispatch('hide');
				pathRequestCount.clear(); // 清空整个 Map
				nprogress.done()
			}
		}
		return res.data;
	}
}, err => {
	return Promise.reject(err)
})
// //响应拦截器
// requests.interceptors.response.use(res => {
// 	nprogress.done()
//     return res.data
// }, err => {
//     return Promise.reject(err)
// })

export default requests

